@@ -41,14 +41,14 @@ module Agents |
||
| 41 | 41 |
temperature and other events are being published. |
| 42 | 42 |
|
| 43 | 43 |
<pre><code>{
|
| 44 |
- 'uri' => 'mqtt://kcqlmkgx:sVNoccqwvXxE@m10.cloudmqtt.com:13858' |
|
| 44 |
+ 'uri' => 'mqtt://kcqlmkgx:sVNoccqwvXxE@m10.cloudmqtt.com:13858', |
|
| 45 | 45 |
'topic' => 'the_thing_system/demo' |
| 46 | 46 |
} |
| 47 | 47 |
</code></pre> |
| 48 | 48 |
|
| 49 | 49 |
Subscribe to all topics |
| 50 | 50 |
<pre><code>{
|
| 51 |
- 'uri' => 'mqtt://kcqlmkgx:sVNoccqwvXxE@m10.cloudmqtt.com:13858' |
|
| 51 |
+ 'uri' => 'mqtt://kcqlmkgx:sVNoccqwvXxE@m10.cloudmqtt.com:13858', |
|
| 52 | 52 |
'topic' => '/#' |
| 53 | 53 |
} |
| 54 | 54 |
</code></pre> |
@@ -81,24 +81,25 @@ module Agents |
||
| 81 | 81 |
{
|
| 82 | 82 |
'uri' => 'mqtts://user:pass@locahost:8883', |
| 83 | 83 |
'ssl' => :TLSv1, |
| 84 |
- 'ca_file' => './ca.pem', |
|
| 84 |
+ 'ca_file' => './ca.pem', |
|
| 85 | 85 |
'cert_file' => './client.crt', |
| 86 | 86 |
'key_file' => './client.key', |
| 87 |
- 'topic' => 'huginn' |
|
| 87 |
+ 'topic' => 'huginn', |
|
| 88 |
+ 'max_read_time' => '10' |
|
| 88 | 89 |
} |
| 89 | 90 |
end |
| 90 | 91 |
|
| 91 | 92 |
def mqtt_client |
| 92 |
- client = MQTT::Client.new(options['uri']) |
|
| 93 |
+ @client ||= MQTT::Client.new(options['uri']) |
|
| 93 | 94 |
|
| 94 | 95 |
if options['ssl'] |
| 95 |
- client.ssl = options['ssl'].to_sym |
|
| 96 |
- client.ca_file = options['ca_file'] |
|
| 97 |
- client.cert_file = options['cert_file'] |
|
| 98 |
- client.key_file = options['key_file'] |
|
| 96 |
+ @client.ssl = options['ssl'].to_sym |
|
| 97 |
+ @client.ca_file = options['ca_file'] |
|
| 98 |
+ @client.cert_file = options['cert_file'] |
|
| 99 |
+ @client.key_file = options['key_file'] |
|
| 99 | 100 |
end |
| 100 | 101 |
|
| 101 |
- client |
|
| 102 |
+ @client |
|
| 102 | 103 |
end |
| 103 | 104 |
|
| 104 | 105 |
def receive(incoming_events) |
@@ -106,15 +107,30 @@ module Agents |
||
| 106 | 107 |
incoming_events.each do |event| |
| 107 | 108 |
c.publish(options['topic'], payload) |
| 108 | 109 |
end |
| 110 |
+ |
|
| 111 |
+ c.disconnect |
|
| 109 | 112 |
end |
| 110 | 113 |
end |
| 111 | 114 |
|
| 112 | 115 |
|
| 113 | 116 |
def check |
| 114 | 117 |
mqtt_client.connect do |c| |
| 115 |
- c.get(options['topic']) do |topic,message| |
|
| 116 |
- create_event :payload => { 'topic' => topic, 'message' => JSON.parse(message), 'time' => Time.now.to_i }
|
|
| 117 |
- end |
|
| 118 |
+ |
|
| 119 |
+ Timeout::timeout(options['max_read_time']) {
|
|
| 120 |
+ c.get(options['topic']) do |topic, message| |
|
| 121 |
+ |
|
| 122 |
+ # A lot of services generate JSON. Try that first |
|
| 123 |
+ payload = JSON.parse(message) rescue message |
|
| 124 |
+ |
|
| 125 |
+ create_event :payload => {
|
|
| 126 |
+ 'topic' => topic, |
|
| 127 |
+ 'message' => payload, |
|
| 128 |
+ 'time' => Time.now.to_i |
|
| 129 |
+ } |
|
| 130 |
+ end |
|
| 131 |
+ } rescue TimeoutError |
|
| 132 |
+ |
|
| 133 |
+ c.disconnect |
|
| 118 | 134 |
end |
| 119 | 135 |
end |
| 120 | 136 |
|